/**
 * 给定一个树，节点上有0或者1，
 * 求节点到子孙的路径权值为奇数的路径的数量
 * 其实就是问子树中1节点的数量
 * 但是要减去自己
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;

vector<vi> G;
vi W;
int N;
string S;

vi D;

void dfs(int u, int p){
    if(S[u] == '1') D[u] = 1;

    for(auto v : G[u]){
        if(v == p) continue;

        dfs(v, u);
        D[u] += D[v];    
    }

    return;
}

void proc(){
    D.assign(N + 1, 0);
    dfs(1, 0);

    for(int i=1;i<=N;++i){
        auto ans = D[i];
        if(S[i] == '1') ans -= 1;
        cout << ans << "\n";
    }
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1; 
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> S;
        S = " " + S;
        G.assign(N + 1, {});
        for(int a,b,i=1;i<N;++i){
            cin >> a >> b;
            G[a].push_back(b);
            G[b].push_back(a);
        }
        proc();
    }
    return 0;
}